package com.atguigu.gmall;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * @author: 李旭
 * @create: 2021-08-31 16:07
 * <p>
 * 异步编排
 **/
public class CompletableFutureDemo3 {

    public static void main(String[] args) throws Exception {// 主线程
        //自定义线程池
        ThreadPoolExecutor threadPoolExecutor =
                new ThreadPoolExecutor(
                        5,//核心线程数
                        10,//最大线程数  5
                        5,//存活时间：超出核心线程数的线程的存活时间
                        TimeUnit.MINUTES,//单位
                        new ArrayBlockingQueue(10) //队列
                );

        //1:创建新线程
        CompletableFuture<String> completableFuture1 = CompletableFuture.supplyAsync(() -> {
            try {
                TimeUnit.SECONDS.sleep(3);
                System.out.println("我是上一个任务");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return "我是上一个任务的返回值";
        }, threadPoolExecutor);
        //2:创建新线程
        CompletableFuture<String> completableFuture2 = CompletableFuture.supplyAsync(() -> {
            System.out.println("我是当前任务");
            return "我是当前任务的返回值";
        }, threadPoolExecutor);
        //3：创建新线程
        CompletableFuture<String> completableFuture3 = CompletableFuture.supplyAsync(() -> {
            System.out.println("我是下一个任务");
            return "我是下一个任务的返回值";
        }, threadPoolExecutor);

        // main 主线程
        //场景： 主线程需要等待子线程执行完成 才能继续    主线程就需要等待子线程
        //多任务组合
        CompletableFuture.allOf(completableFuture1,
                completableFuture2,completableFuture3).join();//等待所有子线程执行完成才可以被唤醒  继续执行主线程
        CompletableFuture.anyOf(completableFuture1,
                completableFuture2,completableFuture3);//等待任意一个线程执行完成就被唤醒 继续主线程
        //问题： 主线程会不会等待三个子线程执行完成呢？  不会
        System.out.println("我是主线程");

    }
}
